package com.funsport.service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 通知服务接口
 * 处理系统通知、消息推送等功能
 *
 * @author Fun-Sport Team
 */
public interface INotificationService {

    /**
     * 发送活动提醒通知
     *
     * @param userIds 用户ID列表
     * @param eventTitle 活动标题
     * @param eventTime 活动时间
     * @return 是否发送成功
     */
    boolean sendEventReminder(List<Long> userIds, String eventTitle, LocalDateTime eventTime);

    /**
     * 发送报名确认通知
     *
     * @param userId 用户ID
     * @param eventTitle 活动标题
     * @param eventTime 活动时间
     * @return 是否发送成功
     */
    boolean sendSignupConfirmation(Long userId, String eventTitle, LocalDateTime eventTime);

    /**
     * 发送俱乐部邀请通知
     *
     * @param userId 被邀请用户ID
     * @param clubName 俱乐部名称
     * @param inviterName 邀请人名称
     * @return 是否发送成功
     */
    boolean sendClubInvitation(Long userId, String clubName, String inviterName);

    /**
     * 发送系统通知
     *
     * @param userIds 用户ID列表
     * @param title 通知标题
     * @param content 通知内容
     * @return 成功发送的数量
     */
    int sendSystemNotification(List<Long> userIds, String title, String content);

    /**
     * 创建应用内通知（存储到数据库）
     *
     * @param userId 用户ID
     * @param title 通知标题
     * @param content 通知内容
     * @param notificationType 通知类型
     * @param relatedId 关联ID（如活动ID、俱乐部ID）
     * @param relatedType 关联类型
     * @return 是否创建成功
     */
    boolean createInAppNotification(Long userId, String title, String content, 
                                   String notificationType, Long relatedId, String relatedType);

    /**
     * 获取用户通知列表
     *
     * @param userId 用户ID
     * @param limit 数量限制
     * @return 通知列表
     */
    List<com.funsport.entity.Notification> getUserNotifications(Long userId, Integer limit);

    /**
     * 标记通知为已读
     *
     * @param notificationId 通知ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markAsRead(Long notificationId, Long userId);

    /**
     * 获取未读通知数量
     *
     * @param userId 用户ID
     * @return 未读数量
     */
    int getUnreadCount(Long userId);
}
